﻿using BeautySalon.Model;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace BeautySalon.Pages
{
    /// <summary>
    /// Логика взаимодействия для ServicePage.xaml
    /// </summary>
    public partial class ServicePage : Page
    {
        public ServicePage()
        {
            InitializeComponent();

            // Передача записей из таблицы 'Service' в DataGrid
            dGridService.ItemsSource = Entities.GetContext().Service.ToList();

            // Передача кол-ва записей из DataGrid
            DisplayCountRowsFromDataGridLb.Content = $"Кол-во текущих записей: ({dGridService.Items.Count})";

            // Передача всех записей из таблицы БД
            DisplayCountRowsFromTableLb.Content = $"Кол-во всех записей ({Entities.GetContext().Service.Count()})";

            // Передача данных в ComboBox 
            FilterCmbx.Items.Add("Все");
            FilterCmbx.Items.Add("до 1000 рублей");
            FilterCmbx.Items.Add("до 2000 рублей");
            FilterCmbx.Items.Add("до 3000 рублей");

            // Проверка пользователя
            if (Manager.IsAdmin == true)
            {
                AddBtn.Visibility = Visibility.Visible;
                DeleteBtn.Visibility = Visibility.Visible;
                EditorSectionBtn.Visibility = Visibility.Visible;
            }
        }

        // Кнопка изменения записи
        private void EditBtn_Click(object sender, RoutedEventArgs e)
        {
            // Получать контекст кнопки и знать, что это — услуга
            Manager.MainFrame.Navigate(new AddServicePage((sender as Button).DataContext as Service));
        }

        // Кнопка добавления записи
        private void AddBtn_Click(object sender, RoutedEventArgs e)
        {
            Manager.MainFrame.Navigate(new AddServicePage(null));
        }

        // Кнопка удаления записи
        private void DeleteBtn_Click(object sender, RoutedEventArgs e)
        {
            // Передача выбранного элемента из списка записей
            var service_remove = dGridService.SelectedItems.Cast<Service>().ToList();
            var service_Remove = dGridService.SelectedItem as Service;

            if (service_remove.Count != 0)
            {
                if (MessageBox.Show($"Вы точно хотите удалить следующие {service_remove.Count()} элементов?",
                                     "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    try // Проверка на ссылочную целостность
                    {
                        var _exist = (from p in Entities.GetContext().ClientService
                                      where p.ServiceID == service_Remove.ID
                                      select p).First();
                        if (_exist != null)
                        {
                            MessageBox.Show("Нельзя удалить, поскольку с этой услугой есть запись!");
                            return;
                        }
                    } catch { }
                    try
                    {
                        Entities.GetContext().Service.RemoveRange(service_remove);
                        Entities.GetContext().SaveChanges();
                        dGridService.ItemsSource = Entities.GetContext().Service.ToList();
                        DisplayCountRowsFromDataGridLb.Content = $"Кол-во текущих записей: ({dGridService.Items.Count})";
                        DisplayCountRowsFromTableLb.Content = $"Кол-во всех записей ({Entities.GetContext().Service.Count()})";
                        MessageBox.Show("Данные удалены!");
                    }
                    catch (Exception ex)
                    { MessageBox.Show(ex.Message,"", MessageBoxButton.OK, MessageBoxImage.Error); }
                }
            }
            else MessageBox.Show("Сначала выберите элемент(ы) в списке!");
        }

        // Обновление страницы с запиями после добавления данных
        private void Page_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (Visibility == Visibility.Visible)
                dGridService.ItemsSource = Entities.GetContext().Service.ToList();
        }

        // Поиск
        private void SearchTxb_TextChanged(object sender, TextChangedEventArgs e)
        {
            UpdateService();
        }

        // Фильтр
        private void FilterCmbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            UpdateService();
        }

        // Механизм одновременной работы поиска и фильтра
        public void UpdateService()
        {
            var serviceList = Entities.GetContext().Service.ToList();

            if (FilterCmbx.SelectedIndex == 1)
                serviceList = serviceList.Where(p => p.Cost < 1000).ToList();
            if (FilterCmbx.SelectedIndex == 2)
                serviceList = serviceList.Where(p => p.Cost < 2000 && p.Cost >= 1000).ToList();

            serviceList = serviceList.Where(p =>
                                            p.Title.ToLower().Contains(SearchTxb.Text.ToLower())).ToList();

            dGridService.ItemsSource = serviceList;
            DisplayCountRowsFromDataGridLb.Content = $"Кол-во текущих записей: ({dGridService.Items.Count})";
        }

        // Сортировки стоимости по возрастанию
        private void SortToCostUpBtn_Click(object sender, RoutedEventArgs e)
        {
            var sql_expr = (from p in Entities.GetContext().Service
                            orderby p.Cost ascending
                            select p).ToList();
            
            dGridService.ItemsSource = sql_expr;
        }

        // Сортировки стоимости по убыванию
        private void SortToCostDownBtn_Click(object sender, RoutedEventArgs e)
        {
            var sql_expr = (from p in Entities.GetContext().Service
                            orderby p.Cost descending
                            select p).ToList();

            dGridService.ItemsSource = sql_expr;
        }
    }
}
